/*
 * IncFile1.h
 *
 * Created: 2012-11-29 19:03:59
 *  Author: ur
 */ 


/*Obsuluga menu
Potrzebne nastepujace funkcje i zmienne
 
 -struktura opisujaca menu
 -struktura przechowujaca aktualna pozycje w menu oraz na wyswietlaczu
 -funkcja odkladajaca na stos aktualne menu
 -funkcja zdejmujaca ze stosu aktualne menu
 -funkcja operujaca na menu gora i dol
 /////////////////////////////////////////*/
 










#ifndef INCFILE1_H_
#define INCFILE1_H_

#define ilosc_poziomow_menu 4
#define  liczba_lini 2
extern volatile uint8_t update_display ;

enum obsluga_klawiatury {e_key_up,e_key_down,e_key_left,e_key_right,e_key_ok,e_enkoder_push,e_enkoder_left, e_enkoder_right,e_no_key};


//Flago opowiedzialne za typ danego menu
#define  autoload (1<<0)			//automate_yczne przeladowanie menu
#define  submenu  (1<<1)			//menu posiada submenu
#define  end_menu	(1<<2)			//koniec menu

/////////////////////////////////////////////////////////////////////////
// struktura opisuj?ca zawartosc menu                          //////////
/////////////////////////////////////////////////////////////////////////


typedef struct menu

{ 		
	uint8_t typ_menu;				// flagi typow danego menu
									// autoload-automatycznie laduje funkcje oblsugujace menu np.dla ekranu glownego
									// sub-menu-menu posiada potomka ktory moze zostac zaladowany , 
									// end- flaga
	void (* funkcje_obslugi)(uint8_t);		// tablica funkcji obslugi menu
	const	struct menu  * tablica_docelowa; // tablica do submenu jesli pozycja takie posiada(dodac flage)
	char  nazwa_menu[17];			//nazwa menu
	
	
}	menu;

enum wybrane_menu{Nawadnianie,System_OFF,Czasy_startowe,Czasy_pracy,Dni_nawadniania,Regulacja_sezonowa,Obs_poj_stacji,Obs_wszystkich_stacji,Czas_i_dzien};

////////////////////////////////////////////////////////////////
//struktura przechowujaca aktualne oraz poprzednie menu///////// 


typedef struct pozycja_menu
{	const menu * wsk_tablica_menu;
	uint8_t pozycja_lcd;
	uint8_t pozycja_w_tablicy_menu;
	
}pozycja_menu;
//////////////////////////////////////////////////////////////////



/*//struktura przechowuj? wskazniki na fukcje przypisane klawiszom
typedef struct key_funkction
{void (* key_up) (void);
	void (*key_down) (void);
	void(* key_esc) (void);
	void (*key_ok)	(void);
	void (*key_menu)(void);
	void (*display_lcd)(void);
	
	} key_funkction;

*/


//zmienne potrzebne do obslugi menu nalezy zadeklarowac w pliku glownym


///////////////////////////////////////////////////////////////////////////
//prototypy funkcji obslugi menu
/////////////////////////////////////////////////////////////

// funkcja kladzie na stos aktualna tablice  menu

void push_menu();



// funkcja zdejmuje aktualna tablice menu

void pop_menu();

//////////////////////////////////////////////////////////////////////////////////
//funkcje dodatkowe przydatne przy zmianie zmiennych					//////////
//////////////////////////////////////////////////////////////////////////////////

//funkcja inkrementuje zmienna
uint8_t inkrement_uint8 (uint8_t zmienna_inkrementowana, uint8_t zakres_max);


//funkcja dekrementuje zmienna 
uint8_t dekrement_uint8 (uint8_t zmienna_dekrementowana, uint8_t zakres_min);


///////////////////////////////////////////////////////////////////////////////




//////////////////////////////////////////////////////////////////////////////
//Funkcje obslugi klawiszy i wy?wietlania
///////////////////////////////////////////////////////////////////////////////
// void (* key_up) (void);
// void (*key_down) (void);
// void(* key_esc) (void);
// void (*key_ok)	(void);
// void (*key_menu)(void);
// void (*display_lcd)(void);



//menu_ekran_glowny
// void  key_up_menu_ekran_glownu_0 (void);
// void key_down_menu_ekran_glownu_0 (void);
// void key_esc_menu_ekran_glownu_0 (void);
// void key_ok_menu_ekran_glownu_0	(void);
// void key_menu_menu_ekran_glownu_0	(void);
// void display_lcd_menu_ekran_glownu_0 (void);


// funkcje biegajaced po menu

// void  key_up_przeglad_menu_1 (void);
// void key_down_przeglad_menu_1(void);
// void key_esc_przeglad_menu_1  (void);
// void key_ok_przeglad_menu_1 	(void);
// void key_menu_przeglad_menu_1 	(void);
// void display_lcd_przeglad_menu_1  (void);

//funkcja powracajaca do menu przy wywolanej funkcji

////////////////////////////////////////////////////////////
//funkcje dostepne na zewnatrz do przegladania menu
//////////////////////////////////////////////////////////

 pozycja_menu * aktualne_menu(void);  // funkcja zwraca aktualna pozycje menu, waraz z tablica menu oraz pozycja lcd
void menu_init(void);				//funkcja pomocnicza inicjujaca menu
//void menu_key_esc (void); // funkcja powraca do przegladu menu z obslugi funkcji
//void wywolanie_menu(void);			// funkcja wywoluje przeglad menu



//////////////////////////////////////////////////////////////////////////////////
// Funkcje zmieniajace pozycje w danym menu
//////////////////////////////////////////////////////////////////////////////////


void	menu_up(void)	;			//funkcje odpowiedzialne poruszanie sie po menu
void	menu_down(void);
void	register_menu(menu const *);		//	funkcja rejestruje menu po przez podanie do niego wskaznika
void * wskaznik_do_funkcji(void);
 void menu_ekran_poczatkowy(void);			//funkcja wyswietla menu z ekranu poczatkowego
extern void (* wybrana_funkcja)(uint8_t);






////////////////////////////////////////////////////////////////////////////////
void key_wybrane_zawory_w_sekcji(uint8_t key);
void key_ustawienia_sekcji(uint8_t key);
void key_ustawienia_czasow(uint8_t key);
void key_rodzaj_pracy(uint8_t key);
void key_dni_do_nawadniania(uint8_t key);
void wyswietl_menu(uint8_t key);
void wyjscie_z_ustawien (void);
void ekran_glowny_menu(uint8_t key);
void ok_key_menu (void);
void esc_key_menu(void);
void	tryb_pracy_automatycznej(uint8_t key);
void tryb_pracy_recznej_poj_stacja(uint8_t key);
void tryb_pracy_recznej_wszt_stacje(uint8_t key);
void key_wybor_programu(uint8_t key);
void key_dni_w_pracy_cyklicznej(uint8_t key);
void key_dni_bez_nawadniania(uint8_t key);
void key_regulacja_sezonowa(uint8_t key);
void key_reczne_nawadnianie_pojedenczyj_stacji(uint8_t key);
void key_reczne_nawadnianie_wszystkich_stacji(uint8_t key);
void key_right_programowe_opoznienie_stacji(uint8_t key);
void key_ofsety_oswietlenia(uint8_t key);
void key_czasy_oswietlenia(uint8_t key);
void key_tryb_reczny_oswietlenia(uint8_t key);

void key_czas_i_dzien_prog(uint8_t key);
 

//void key_register(key_funkction * );

//zalanczanie pauzy
void pauza_on_off (void);


#endif /* INCFILE1_H_ */